package com.winter.collection.List;

import org.junit.Test;

import java.util.LinkedList;

/**
 * @program: Collection
 * @description: LinkedList集合的API使用详解
 * @author: Mr.Liang
 * @create: 2018-01-10 11:14
 **/
public class LinkedListAPI {
    @Test
    public void linkedList() {
//        LinkedList的API详解
        linkedListAPIs();
//        LinkedList的LIFO（后进先出）的堆栈
        linkedListLIFO();
//        LinkedList的FIFO（先进先出）的队列
        linkedListFIFO();
    }

    /*API详细解析*/
    @Test
    public void linkedListAPIs() {
        /*新建一个LinkedList*/
        LinkedList<Object> list = new LinkedList<Object>();
//        -------------添加操作
        /*依次添加元素*/
        list.add("一");
        list.add("二");
        list.add("三");
        /*向第几个位置添加元素*/
        list.add(1, "你");

        list.addFirst("十");//将元素添加到第一个位置，失败抛出异常(NoSuchElementException)
        System.out.println("addFirst():" + list);
        list.addLast("11");//将元素添加到最后一个位置，失败抛出异常
        System.out.println("addLast():" + list);
        list.removeFirst();//将第一个位置的元素删除，失败抛出异常
        System.out.println("removeFirst():" + list);
        list.removeLast();//将最后一个元素删除，失败抛出异常
        System.out.println("removeLast():" + list);
        System.out.println("getFirst():" + list.getFirst());//获取第一个元素,失败抛出异常
        System.out.println("getLast():" + list.getLast());//获取最后一个元素,失败抛出异常

        boolean offerFirst = list.offerFirst("10");//添加元素到第一个位置，添加成功返回true
        System.out.println("offerFirst():" + offerFirst + list);
        boolean offerLast = list.offerLast("12");//添加元素到最后一个位置，成功返回true
        System.out.println("offerLast():" + offerLast + list);
        list.pollFirst();//将第一个位置的元素，删除，失败返回null
        System.out.println("pollFirst():" + list);
        list.pollLast();//将最后一个元素删除，失败返回null
        System.out.println("pollLast():" + list);
        System.out.println("peekFirst():" + list.peekFirst());//获取第一个的元素，失败返回null
        System.out.println("peekLast():" + list.peekLast());//获取最后一个的元素，失败返回null

        /*将第N+1个元素设置新的值，不建议在LinkedList中使用此操作，效率低*/
        list.set(3, "15");
        /*获取第N+1个元素，不建议这样操作，效率低*/
        System.out.println(list.get(3));

        /*将集合转换成数组*/
        String[] strings = list.toArray(new String[0]);
        for (String s : strings
                ) {
            System.out.println(s);
        }

        /*输出集合的大小（容量）*/
        System.out.println(list.size());
        /*清空集合*/
        list.clear();
        /*判断集合是否为空*/
        System.out.println(list.isEmpty());

    }

    /*LIFO后进先出堆栈*/
    @Test
    public void linkedListLIFO() {
        LinkedList<Object> list = new LinkedList<>();
        /*添加到堆栈中*/
        list.push("1");
        list.push("2");
        list.push("3");
        list.push("4");
        System.out.println(list);

        /*删除栈顶元素*/
//        System.out.println(list.pop());
        /*获取栈顶元素*/
        System.out.println(list.peek());
        System.out.println(list);
    }

    /*FIFO先进先出队列*/
    @Test
    public void linkedListFIFO() {
        LinkedList<Object> list = new LinkedList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        System.out.println(list);

        /*删除队列的第一个元素*/
        System.out.println(list.remove());
        /*获取队列的第一个元素*/
        System.out.println(list.element());
        System.out.println(list);
    }
}
